package com.jingdianjichi.wx.utils;

import lombok.extern.slf4j.Slf4j;

import java.security.MessageDigest;
import java.util.Arrays;

/**
 * sha1生成签名工具
 *
 * @author: ChickenWing
 * @date: 2023/11/5
 */
@Slf4j
public class SHA1 {

    /**
     * 生成SHA1签名
     * @param token 公众号的token
     * @param timestamp 微信服务器传过来的时间戳
     * @param nonce 微信服务器传过来的随机数
     * @return SHA1加密后的签名
     */
    public static String generateSHA1Signature(String token, String timestamp, String nonce) {
        // 1. 将token、timestamp、nonce三个参数按字典序排序
        String[] params = new String[]{token, timestamp, nonce};
        Arrays.sort(params);

        // 2. 拼接成一个字符串
        StringBuilder sb = new StringBuilder();
        for (String param : params) {
            sb.append(param);
        }

        // 3. 使用SHA1进行加密
        String signature = sha1(sb.toString());
        return signature;
    }

    /**
     * 对字符串进行SHA1加密
     * @param input 输入字符串
     * @return SHA1加密后的结果
     */
    private static String sha1(String input) {
        try {
            // 获取SHA1 MessageDigest实例
            MessageDigest digest = MessageDigest.getInstance("SHA-1");

            // 执行SHA1加密
            byte[] hash = digest.digest(input.getBytes("UTF-8"));

            // 将字节数组转化为十六进制字符串
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                // 将每个字节转化为两位十六进制字符串
                String hex = Integer.toHexString(0xFF & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }

            return hexString.toString().toLowerCase();  // 返回小写形式的SHA1签名
        } catch (Exception e) {
            throw new RuntimeException("SHA1加密失败", e);
        }
    }

    public static void main(String[] args) {
        // 测试用例
        String token = "your_token";  // 公众号的token
        String timestamp = "timestamp_from_wechat";  // 微信服务器传过来的时间戳
        String nonce = "nonce_from_wechat";  // 微信服务器传过来的随机数
        String echostr = "echostr_from_wechat";  // 微信服务器传过来的随机字符串

        String signature = generateSHA1Signature(token, timestamp, nonce);
        System.out.println("SHA1 Signature: " + signature);
    }
}
